# 在Selenium中将操作鼠标的方法封装在ActionChains类中
# 常见的鼠标操作有：点击、右击、双击、悬停、拖拽等，对于这些鼠标操作Selenium都封装了相应的操作方法
"""
实例化对象：
action = ActionChains(driver)
方法：
1. context_click(element) 右击 --> 模拟鼠标右键点击效果
2. double_click(element) 双击 --> 模拟鼠标双击效果
3. drag_and_drop(source, target) 拖动 --> 模拟鼠标拖动效果
4. move_to_element(element) 悬停 --> 模拟鼠标悬停效果
5. perform() 执行 --> 此方法用来执行以上所有鼠标操作
为了更好的学习其他方法，我们先学习perform()执行方法,因为所有的方法都需要执行才能生效
"""
# 鼠标执行-perform()


"""
说明：在ActionChains类中所有提供的鼠标事件方法，在调用的时候所有的行为都存储在ActionChains对
象中，而perform()方法就是真正去执行所有的鼠标事件。
强调：必须调用perform()方法才能执行鼠标事件
"""
# 鼠标右键-context_click()
# 说明：对于点击鼠标右键，如果弹出的是浏览器默认的菜单，Selenium没有提供操作菜单选项的方法；
# 如果是自定义的右键菜单，则可以通过元素定位来操作菜单中的选项。

# 鼠标双击-double_click()

# 案例：
# 需求1：打开注册页面A，在用户名文本框上点击鼠标右键
# 需求2：打开注册页面A，输入用户名admin，暂停3秒钟后，双击鼠标左键，选中adminc
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://121.43.169.97:8848/pageA.html")
# 放大浏览器页面
driver.maximize_window()
# 实例化且获取ActionChains对象
action = ActionChains(driver)

# # 定位用户名
# username = driver.find_element_by_css_selector("#userA")
# # 调用右击方式
# r = action.context_click(username)
# # 执行鼠标右击
# r.perform()

# 定位用户名，调用右击方式，执行鼠标右击，代码合并
action.context_click(driver.find_element_by_css_selector("#userA")).perform()

# # 输入用户名admin
# name = driver.find_element_by_css_selector("#userA").send_keys("admin")
# # 暂停3秒钟
# time.sleep(3)
# # 鼠标双击-double_click()
# l = action.double_click(name)
# # 执行选中admin
# l.perform()
time.sleep(3)
# 合并一行
action.double_click(driver.find_element_by_css_selector("#userA")).send_keys("admin").perform()

# 鼠标移动到'注册按钮'， 预期：按钮变色
button = driver.find_element_by_xpath("//p[5]/button")
action.move_to_element(button).perform()

time.sleep(3)
driver.quit()

